package cn.jisol.ngame.sync.state;

import cn.jisol.ngame.proto.JNSyncMessage;
import cn.jisol.ngame.sync.frame.JNSyncFrame;
import lombok.Getter;
import lombok.Setter;

import java.util.HashMap;

// 同步状态
@Getter
@Setter
public abstract class JNSyncState {


    //回调
    private JNSyncStateCallBack callBack;
    private JNSyncStateAllDataCallBack allCallBack;

    //最新状态
    HashMap<Integer,JNSyncMessage.JNStateItemData> allData = new HashMap<>();

    //绑定回调事件
    public void Bind(JNSyncStateCallBack callBack){
        this.callBack = callBack;
    }
    public void BindAll(JNSyncStateAllDataCallBack callBack){
        this.allCallBack = callBack;
    }

    //更新全量状态
    public void AllStateUpdate(HashMap<Integer,JNSyncMessage.JNStateItemData> data){
        allData = data;
    }

    //更新状态
    public void StateUpdate(JNSyncMessage.JNStateItemData data){

        if (allData.containsKey(data.getNetID())){

            JNSyncMessage.JNStateItemData.Builder builder = allData.get(data.getNetID()).toBuilder();

            data.getMessagesMap().forEach((key,value) -> {
                if (builder.containsMessages(key)) {
                    Merge(builder.getMessagesOrThrow(key),value);
                }else{
                    builder.putMessages(key,value);
                }
            });


        }else{
            allData.put(data.getNetID(),data);
        }

        callBack.onSyncState(data);

    }

    //合并
    protected abstract JNSyncMessage.JNStateData Merge(JNSyncMessage.JNStateData oldData, JNSyncMessage.JNStateData newData);


    public interface JNSyncStateCallBack {
        void onSyncState(JNSyncMessage.JNStateItemData data);
    }
    public interface JNSyncStateAllDataCallBack {
        void onSyncState(JNSyncMessage.JNStateAllData data);
    }

}
